// api/aiApi.js

/**
 * 调用云函数的通用方法
 * @param {string} name - 云函数名称
 * @param {string} action - 操作类型
 * @param {object} params - 请求参数
 */
const callCloudFunction = (name, action, params = {}) => {
  return new Promise((resolve, reject) => {
    wx.cloud.callFunction({
      name: name,
      data: {
        action: action,
        params: params
      },
      success: res => {
        if (res.result && res.result.success) {
          resolve(res.result);
        } else {
          reject(res.result || { message: '操作失败' });
        }
      },
      fail: err => {
        console.error(`调用云函数[${name}.${action}]失败:`, err);
        reject(err);
      }
    });
  });
};

const aiApi = {
  /**
   * 生成图像
   * @param {string} prompt - 提示词
   * @param {string} negativePrompt - 反向提示词(可选)
   * @param {object} options - 其他选项
   * @returns {Promise}
   */
  generateImage: (prompt, negativePrompt = '', options = {}) => {
    const params = {
      prompt: prompt,
      negativePrompt: negativePrompt,
      ...options
    };
    
    return callCloudFunction('imageGeneration', 'generateImage', params);
  },
  
  /**
   * 获取图像生成结果
   * @param {string} taskId - 任务ID
   * @returns {Promise}
   */
  getImageResult: (taskId) => {
    return callCloudFunction('imageGeneration', 'getImageResult', { taskId });
  },
  
  /**
   * 重新生成图像
   * @param {string} taskId - 任务ID(可选)，如提供则基于该任务重新生成
   * @param {string} prompt - 新的提示词(可选)
   * @param {string} negativePrompt - 新的反向提示词(可选)
   * @param {object} options - 其他选项
   * @returns {Promise}
   */
  regenerateImage: (taskId, prompt, negativePrompt, options = {}) => {
    const params = {
      taskId,
      prompt,
      negativePrompt,
      ...options
    };
    
    return callCloudFunction('imageGeneration', 'regenerateImage', params);
  },

  /**
   * 轮询任务状态直到完成
   * @param {string} taskId - 任务ID
   * @param {number} interval - 轮询间隔(毫秒)
   * @param {number} timeout - 超时时间(毫秒)
   * @returns {Promise}
   */
  pollTaskUntilDone: (taskId, interval = 2000, timeout = 120000) => {
    return new Promise((resolve, reject) => {
      const startTime = Date.now();
      
      const checkTask = () => {
        // 检查是否超时
        if (Date.now() - startTime > timeout) {
          reject(new Error('任务轮询超时'));
          return;
        }
        
        aiApi.getImageResult(taskId)
          .then(result => {
            const status = result.data?.status;
            
            if (status === 'SUCCEEDED') {
              // 任务成功完成
              resolve(result);
            } else if (status === 'FAILED' || status === 'SUSPENDED') {
              // 任务失败
              reject(new Error(result.message || '图像生成失败'));
            } else {
              // 任务仍在进行中，继续轮询
              setTimeout(checkTask, interval);
            }
          })
          .catch(err => {
            reject(err);
          });
      };
      
      // 开始轮询
      checkTask();
    });
  }
};

module.exports = aiApi; 